package installer

import (
	"context"
	"fmt"

	"gitee.com/liumou_site/glpm"
	"go.uber.org/zap"
)

// PackageManager 简化版包管理器，直接使用glpm
type PackageManager struct {
	manager glpm.PackageManager
	ctx     context.Context
}

// NewPackageManager 创建新的包管理器（简化版）
func NewPackageManager() (*PackageManager, error) {
	ctx := context.Background()

	// 获取推荐的包管理器
	recommendedManager := glpm.GetRecommendedManager()

	// 创建包管理器配置
	config := glpm.NewManagerConfig()
	// 不需要设置sudo，程序运行已经检测了权限

	// 获取包管理器实例
	pm, err := glpm.GetPackageManager(recommendedManager, config)
	if err != nil {
		return nil, fmt.Errorf("创建glpm包管理器失败: %v", err)
	}

	return &PackageManager{
		manager: pm,
		ctx:     ctx,
	}, nil
}

// IsPackageInstalled 检查包是否已安装（使用glpm）
func (pm *PackageManager) IsPackageInstalled(packageName string) bool {
	installed, err := pm.manager.IsInstalled(pm.ctx, packageName)
	if err != nil {
		zap.L().Warn("检查包安装状态时出错", 
			zap.String("package", packageName), 
			zap.Error(err))
		return false
	}
	return installed
}

// InstallPackage 安装包（使用glpm）
func (pm *PackageManager) InstallPackage(packageName string) bool {
	// 首先更新包列表
	if err := pm.manager.Update(pm.ctx); err != nil {
		zap.L().Warn("更新包列表失败", zap.Error(err))
	}

	// 安装包
	if err := pm.manager.Install(pm.ctx, []string{packageName}); err != nil {
		zap.L().Error("使用glpm安装包失败", 
			zap.String("package", packageName), 
			zap.Error(err))
		return false
	}

	zap.L().Info("使用glpm安装包成功", zap.String("package", packageName))
	return true
}

// GetPackageMapping 获取包名映射（简化版，直接返回原包名）
func (pm *PackageManager) GetPackageMapping(packageName string) string {
	// glpm会自动处理不同发行版的包名差异
	// 这里直接返回原包名，由glpm内部处理映射
	return packageName
}